// 封装user.js 保存用户token

// 导入user的接口
import { loginAPI, userInfoAPI, userPhotoAPI } from '@/api/index'
// 倒入重置路由的方法
import { resetRouter } from '@/router'
// 导入本地处理token的方法
import { setToken, getToken, removeToken, setTImeStamp, delTime } from '@/utils/auth'

export default {
  name: 'user',
  namespaced: true,
  state: {
    // 保存token
    token: getToken() || '', // 如果本地有token就拿到本地存储的token
    userInfo: {} // 当前登录的用户对象
  },
  mutations: {
    // 保存token的方法
    setToken(state, payload) {
      setToken(payload) // 同时把token保存到cookie
      state.token = payload // token保存到vuex
      setTImeStamp() // 保存token的设置时间
    },
    // 移除token的方法
    delToken(state) {
      // 删除本地的token
      removeToken()
      // 删除内存中的token
      state.token = ''
      // 删除token的有效时间
      delTime()
    },
    // 给userInfo赋值
    setUserInfo(state, payload) {
      state.userInfo = payload
    },
    // 清除userInfo
    removeUserInfo(state) {
      state.userInfo = ''
    }
  },
  actions: {
    // 请求服务器的登录接口，得到登陆成功后的token
    async getToken(context, payload) {
      // 使用try catch将可能出错的代码包裹起来
      try {
        // 发起网络请求
        const res = await loginAPI(payload)
        // console.log(res)
        // 保存获得的token
        // context.commit('setToken', res.data.data)
        context.commit('setToken', res.data) // 当响应拦截的代码处理改变后，这里的代码也做出相应的改变
      } catch (error) {
        return Promise.reject(error) // 将错误信息交给外界
      }
    },
    // 请求登录服务器的接口，得到当前登录的用户的数据
    async getUserInfo(context, payload) {
      // 发起请求，获得用户基本信息
      const res = await userInfoAPI()
      const _res = res.data
      // 发起请求，获得员工基本信息
      const photo = await userPhotoAPI(_res.userId)
      const _photo = photo.data
      // 将得到的两个对象合并
      const userData = { ..._res, ..._photo }
      // 保存用户信息
      context.commit('setUserInfo', userData)
      // 注意点：将 newRes 返回出来（目前用不上，这是为后面埋下的伏笔）
      return userData
    },
    // 退出登录，删除用户信息和token
    logout(context) {
      context.commit('removeUserInfo')
      context.commit('delToken')
      // 清除路由信息
      resetRouter()
    }
  }
}
